package com.mybank.dao.impl;

import com.mybank.dao.ClienteDao;
import com.mybank.bo.exception.ClienteNulo;
import com.mybank.domain.Cliente;
import org.springframework.stereotype.Repository;

import java.io.IOException;
import java.util.Properties;
import java.sql.*;

/**
 * 
 * @author mjcali
 */
@Repository
public class ClienteDaoImpl implements ClienteDao {

    private Properties pro;
    private String driverDb;
    private String urlDb;
    private String usuarioDb;
    private String passwordDb;

    /**
     * retorna el cliente ingresado como parametro
     * Se define un comportamiento harcodeado hasta la implementación definitiva con Hibernate
     * @param idCliente - cliente buscado
     * @return Cliente - objeto cliente buscado
     * @throws ClienteNulo - Excepcion que se lanza si el cliente buscado es nulo
     */
    @Override
    public Cliente buscarCliente(String idCliente) throws ClienteNulo {

        if (idCliente == null) {
            throw new ClienteNulo();
        }

        cargarConfiguraciones();

        try {
            Class.forName(driverDb);
        } catch (ClassNotFoundException e) {
            System.out.println(e.toString());
        }

        String sql = "SELECT * FROM CLIENTES WHERE ID = '" + idCliente + "'";
        Cliente cliente = null;

        try {
            Connection con = DriverManager.getConnection(urlDb, usuarioDb, passwordDb);
            Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet resultSet = stmt.executeQuery(sql);
            resultSet.last();
            int rowCount = resultSet.getRow();

            // si no hay elementos lanzo cliente Nulo
            if (rowCount == 0) {
                throw new ClienteNulo();
            } else {
                resultSet.beforeFirst();
                cliente = new Cliente();
                cliente.setId(idCliente);
                while (resultSet.next()) {
                    cliente.setApellido(resultSet.getString(2));
                    cliente.setNombre(resultSet.getString(3));
                    cliente.setDocumento(resultSet.getString(4));
                }
            }

            resultSet.close();
            stmt.close();
            con.close();
        } catch (SQLException e) {
        } catch (Exception e) {
            System.out.println(e);
        }
        return cliente;
    }

    public void cargarConfiguraciones() {
        pro = new Properties();
        try {
            pro.load(this.getClass().getResource("mybank.properties").openStream());
            // leo las propiedades ingresadas en Controller
            driverDb = pro.getProperty("driverClassName");
            urlDb = pro.getProperty("url");
            usuarioDb = pro.getProperty("username");
            passwordDb = pro.getProperty("password");
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }

    public String getValue(String key) {
        return pro.getProperty(key);
    }
}
